package com.itheima.admin.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.itheima.PageVo;
import com.itheima.Result;
import com.itheima.admin.dto.moduleDto;
import com.itheima.admin.dto.PageDto;

import com.itheima.admin.mapper.ModuleMapper;
import com.itheima.admin.pojo.Dept;
import com.itheima.admin.pojo.module;
import com.itheima.admin.service.IModuleService;

import com.itheima.admin.vo.DeptVo;
import com.itheima.admin.vo.ModuleAllItemVo;
import com.itheima.admin.vo.moduleVo;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.stream.Collectors;

@Service
public class ModuleImpl extends ServiceImpl<ModuleMapper, module> implements IModuleService {

    @Autowired
    private ModuleMapper moduleMapper;

    @Override
    public PageVo<moduleVo> queryByPage(PageDto pageDto) {
        IPage<module> page = new Page(pageDto.getCurrentPage(),pageDto.getPageSize());
        QueryWrapper<module> queryWrapper = null;
        if(pageDto.getQueryString()!=null){
            queryWrapper = new QueryWrapper<>();
            queryWrapper.like("name",pageDto.getQueryString());
        }
        IPage<module> moduleIPage = moduleMapper.selectPage(page,queryWrapper);
        List<moduleVo> collect = getmoduleVos(moduleIPage.getRecords());
        return new PageVo<moduleVo>(collect,(int) moduleIPage.getTotal());
    }

    private List<moduleVo> getmoduleVos(List<module> deptIPage) {
        List<moduleVo> collect=null;
        if(deptIPage!=null){
            collect = deptIPage.stream().map(module -> {
                moduleVo moduleVo = new moduleVo();
                BeanUtils.copyProperties(module, moduleVo);
                return moduleVo;
            }).collect(Collectors.toList());
        }
        return collect;
    }

    @Override
    public List<moduleVo> queryAll() {
        List<module> modules = moduleMapper.selectList(null);
        return getmoduleVos(modules);
    }

    @Override
    public Result addmodule(moduleDto moduleDto) {
        module module = new module();
        BeanUtils.copyProperties(moduleDto,module);
        int insert = moduleMapper.insert(module);
        return  new Result(insert>0,insert>0?"添加成功":"添加失败",null);
    }

    @Override
    public Result deletemodule(String id) {
        int i = moduleMapper.deleteById(id);
        return new Result(i>0,i>0?"删除成功":"删除失败",null);
    }

    @Override
    public moduleVo queryById(String id) {
        module module = moduleMapper.selectById(id);
        moduleVo moduleVo = new moduleVo();
        BeanUtils.copyProperties(module,moduleVo);
        return moduleVo;
    }

    @Override
    public Result updatemodule(moduleDto moduleDto) {
        module module = new module();
        BeanUtils.copyProperties(moduleDto,module);
        int i = moduleMapper.updateById(module);

        return new Result(i>0,i>0?"修改成功":"修改失败",null);
    }



    @Override
    public List<ModuleAllItemVo> listAllModule() {
        List<module> moduleList = list(new QueryWrapper<module>().isNull("parent_id" ));
        List<ModuleAllItemVo> list = moduleList.stream().map(module -> {
            ModuleAllItemVo moduleAllItemVo = new ModuleAllItemVo();
            moduleAllItemVo.setId(module.getModuleId());
            moduleAllItemVo.setLabel(module.getName());
            return moduleAllItemVo;
        }).collect(Collectors.toList());
        for (ModuleAllItemVo module: list){
            module.setChildren(listModules(String.valueOf(module.getId())));
        }
        return list;
    }

    List<ModuleAllItemVo> listModules(String parentId){
        List<module> list = list(new QueryWrapper<module>().eq("parent_id", parentId));
        return list.stream().map(module -> {
            ModuleAllItemVo moduleAllItemVo = new ModuleAllItemVo();
            moduleAllItemVo.setId(module.getModuleId());
            moduleAllItemVo.setLabel(module.getName());
            if (module.getParentId()!=null){
                moduleAllItemVo.setChildren(listModules(module.getModuleId()));
            }
            return moduleAllItemVo;
        }).collect(Collectors.toList());
    }
}
